﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CShaspTaskCancel
{
    public partial class FrmTask : Form
    {
        public FrmTask()
        {
            InitializeComponent();
        }

        //取消任务信号源对象
        private CancellationTokenSource cts = new CancellationTokenSource();

        //手动停止事件对象
        private ManualResetEvent mResetEvent = new ManualResetEvent(true);

        private void btnStart_Click(object sender, EventArgs e)
        {
            // 如果任务被取消，则重新创建一个
            if(cts.IsCancellationRequested)
            {
                cts = new CancellationTokenSource();
            }

            Task task = new Task(() =>
            {
                int counter = 0;
                while (!cts.IsCancellationRequested)
                {
                    mResetEvent.WaitOne(); //用来控制是否需要暂停和继续

                    //实际开发中，可以在这个地方编写你要实现的任务
                    counter++;
                    Thread.Sleep(300);

                    Console.WriteLine(counter);
                }
            },cts.Token);

            cts.CancelAfter(3000); //3秒后自动取消任务

            task.Start();

            //注册一个委托：这个委托将任务取消的时候调用
            cts.Token.Register(() =>
            {
                //在这个地方可以编写自己要处理的逻辑...
                Console.WriteLine("任务取消，开始清理工作.......");

            });
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            cts.Cancel(); //调用这个取消的方法即可
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            mResetEvent.Reset();
        }

        private void btnSet_Click(object sender, EventArgs e)
        {
            mResetEvent.Set();
        }
    }
}
